// // #ifndef WINDOWMONITOR_H
// // #define WINDOWMONITOR_H

// // #include <QMainWindow>

// // namespace Ui {
// // class WindowMonitor;
// // }

// // class WindowMonitor : public QMainWindow
// // {
// //     Q_OBJECT

// // public:
// //     explicit WindowMonitor(QWidget *parent = nullptr);
// //     ~WindowMonitor();

// // private:
// //     Ui::WindowMonitor *ui;
// // };

// // #endif // WINDOWMONITOR_H
// #ifndef WINDOWMONITOR_H
// #define WINDOWMONITOR_H

// #include <QMainWindow>
// #include <QString>

// // 必须包含 Windows 头文件
// #include <windows.h>

// QT_BEGIN_NAMESPACE
// namespace Ui {
// class WindowMonitor;
// }
// QT_END_NAMESPACE

// class WindowMonitor : public QMainWindow
// {
//     Q_OBJECT

// public:
//     explicit WindowMonitor(QWidget *parent = nullptr);
//     ~WindowMonitor();

//     void startMonitoring();
//     void stopMonitoring();

// signals:
//     void activeWindowChanged(const QString &windowTitle, quintptr windowId);

// private:
//     static void CALLBACK winEventProc(
//         HWINEVENTHOOK hWinEventHook,
//         DWORD event,
//         HWND hwnd,
//         LONG idObject,
//         LONG idChild,
//         DWORD dwEventThread,
//         DWORD dwmsEventTime
//         );

//     HWINEVENTHOOK m_hWinEventHook{nullptr};
//     static WindowMonitor* m_instance; // 用于在静态回调中访问实例

//     Ui::WindowMonitor *ui;
// };

// #endif // WINDOWMONITOR_H








#ifndef WINDOWMONITOR_H
#define WINDOWMONITOR_H

#include <QMainWindow>
#include <QTimer>
#include <QString>

#include <windows.h>

namespace Ui {
class WindowMonitor;
}

class WindowMonitor : public QMainWindow
{
    Q_OBJECT

public:
    explicit WindowMonitor(QWidget *parent = nullptr);
    ~WindowMonitor();

signals:
    void activeWindowChanged(const QString &title, quintptr hwnd, const QString &processName);

private slots:
    void checkForegroundWindow(); // 定时检查

private:
    static void CALLBACK winEventProc(
        HWINEVENTHOOK hWinEventHook,
        DWORD event,
        HWND hwnd,
        LONG idObject,
        LONG idChild,
        DWORD dwEventThread,
        DWORD dwmsEventTime
        );

    void updateActiveWindow(HWND hwnd);

    HWINEVENTHOOK m_hWinEventHook{nullptr};
    QTimer *m_timer;
    quintptr m_lastHwnd{0};

    static WindowMonitor* m_instance;
    Ui::WindowMonitor *ui;
};

#endif // WINDOWMONITOR_H
